-- 从KEYS数组获取限流键（格式：当前时间戳秒数）
-- 用于控制单位时间内的请求频率限制
local limitKey = KEYS[1]

-- 从KEYS数组获取用户持有商品键（格式：REDIS_HOLD + 商品ID + 用户ID）
-- 用于记录用户是否已成功秒杀，防止重复抢购
local holdKey = KEYS[2]

-- 从KEYS数组获取商品库存键（格式：REDIS_STORE + 商品ID）
-- 用于存储和扣减商品库存数量
local storeKey = KEYS[3]

-- 从ARGV数组获取用户ID参数
-- 标识当前执行秒杀操作的用户
local userId = ARGV[1]

-- 从ARGV数组获取最大限流数参数
-- 表示单位时间内允许的最大请求数量
local maxLimit = ARGV[2]

-- 检查用户是否已持有商品（防止重复抢购）
-- EXISTS命令返回1表示存在，0表示不存在，转换为数字类型
local isHold = tonumber(redis.call('EXISTS', holdKey))

-- 如果用户已持有商品（isHold=1），返回-1标识重复抢购
if isHold == 1 then
    return -1
end

-- 将最大限流数转换为数字类型
local limit = tonumber(maxLimit)
-- 获取当前限流键的计数值，默认为0（如果键不存在）
local isLimit = tonumber(redis.call('GET', limitKey) or '0')

-- 如果当前请求数超过最大限流值，返回-2标识限流
if isLimit > limit then
    return -2
end

-- 增加限流计数器（+1）
redis.call('INCRBY', limitKey, '1')
-- 设置限流键过期时间为2秒（防止键永久留存）
redis.call('EXPIRE', limitKey, '2')

-- 获取商品库存数量
local isStore = tonumber(redis.call('GET', storeKey))
-- 如果库存小于等于0，返回-3标识库存不足
if isStore <= 0 then
    return -3
end

-- 库存减1操作，并获取减后库存数量
local storeNum = tonumber(redis.call('DECRBY', storeKey, '1'))

-- 记录用户持有商品（设置用户ID到holdKey）
redis.call('SET', holdKey, userId)

-- 返回剩余库存数量（成功抢购）
return storeNum